#!/usr/bin/env node

// ES模块启动器 - 用于在打包环境中正确加载ES模块
// 此文件必须以.mjs扩展名保存，表明它是ES模块

import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { spawnSync } from 'child_process';
import fs from 'fs';

// 获取当前文件的目录
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

console.log('[启动器] 启动中...');
console.log(`[启动器] 当前目录: ${__dirname}`);
console.log(`[启动器] 进程参数: ${process.argv.join(' ')}`);

// 检查要启动的脚本
const targetScript = join(__dirname, 'ads_puppeteer.js');
console.log(`[启动器] 目标脚本路径: ${targetScript}`);

// 检查脚本是否存在
if (!fs.existsSync(targetScript)) {
  console.error(`[启动器] 错误: 目标脚本不存在: ${targetScript}`);
  process.exit(1);
}

// 创建临时的package.json文件确保ES模块支持
const packageJsonPath = join(__dirname, 'package.json');
if (!fs.existsSync(packageJsonPath)) {
  console.log('[启动器] 创建临时package.json以支持ES模块');
  const packageJson = {
    "type": "module",
    "name": "puppeteer-ads-temp",
    "version": "1.0.0",
    "private": true
  };
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
}

// 获取传递给脚本的参数
const scriptArgs = process.argv.slice(2);
console.log(`[启动器] 传递参数: ${scriptArgs.join(' ')}`);

// 检查是否有taskId或windowRunData参数
const hasTaskParams = scriptArgs.some(arg =>
  arg.startsWith('taskId=') || arg.startsWith('windowRunData=')
);

if (hasTaskParams) {
  console.log('[启动器] 检测到任务参数，将通过环境变量传递到子进程');
}

// 确定Node.js可执行文件路径
let nodeExecutable = 'node';
if (process.env.APP_RESOURCE_PATH) {
  const nodePath = join(process.env.APP_RESOURCE_PATH, 'node', process.platform === 'win32' ? 'node.exe' : 'node');
  if (fs.existsSync(nodePath)) {
    console.log(`[启动器] 使用内置Node.js: ${nodePath}`);
    nodeExecutable = nodePath;
  } else {
    console.log(`[启动器] 内置Node.js不存在: ${nodePath}，将使用系统node命令`);
  }
}

// 使用Node.js执行脚本，强制使用ES模块模式
try {
  console.log('[启动器] 正在使用ES模块模式执行脚本...');

  const result = spawnSync(nodeExecutable, [
    '--experimental-modules',
    '--no-warnings',
    targetScript,
    ...scriptArgs
  ], {
    stdio: 'inherit', // 将子进程的标准输入/输出/错误直接连接到父进程
    env: {
      ...process.env,
      // 强制设置NODE_PATH以包含当前目录
      NODE_PATH: process.env.NODE_PATH ?
        `${process.env.NODE_PATH}:${__dirname}` :
        __dirname
    }
  });

  if (result.error) {
    console.error('[启动器] 执行脚本时出错:', result.error);
    process.exit(1);
  }

  // 使用子进程的退出码作为父进程的退出码
  process.exit(result.status);
} catch (error) {
  console.error('[启动器] 执行脚本失败:', error);
  process.exit(1);
}